use std::char::MAX;

fn main() {
  /** 1. bool*/
  let is_true: bool = true;
  println!("is_true = {}", is_true); //is_true = true
  let is_false = false;
  println!("is_false = {} {}", is_false, is_false); //is_false = false false

  /** 2. char
      Rust 的 char 类型的大小为四个字节(four bytes)，并代表了一个 Unicode 标量值（Unicode Scalar Value），这意味着它可以比 ASCII 表示更多内容。在 Rust 中，拼音字母（Accented letters），中文、日文、韩文等字符，emoji（绘文字）以及零长度的空白字符都是有效的 char 值。Unicode 标量值包含从 U+0000 到 U+D7FF 和 U+E000 到 U+10FFFF 在内的值。不过，“字符” 并不是一个 Unicode 中的概念，所以人直觉上的 “字符” 可能与 Rust 中的 char 并不符合。第八章的 “使用字符串存储 UTF-8 编码的文本” 中将详细讨论这个主题。
   */
  //char 在rust里 是32位的
  //emmm ...? ---> 一个unicode码点
  let c: char = 'a';
  println!("c = {}", c); //c = a
  let c = '你'; //c++的会报错, 因为c++里char是8位, 放不下
  println!("c = {}", c); //c = 你

  /** 3. number
      长度	有符号	无符号
      8-bit	i8	u8
      16-bit	i16	u16
      32-bit	i32	u32
      64-bit	i64	u64
      128-bit	i128	u128
      arch	isize	usize

      有符号数以补码形式（two’s complement representation） 存储
      - https://en.wikipedia.org/wiki/Two%27s_complement

      每一个有符号的变体可以储存包含从 -2^(n - 1) 到 2^(n - 1) - 1 在内的数字，这里 n 是变体使用的位数。所以 i8 可以储存从 -2^7 到 2^7 - 1 在内的数字，也就是从 -128 到 127。无符号的变体可以储存从 0 到 2^n - 1 的数字，所以 u8 可以储存从 0 到 2^8 - 1 的数字，也就是从 0 到 255。

      另外，isize 和 usize 类型依赖运行程序的计算机架构：64 位架构上它们是 64 位的， 32 位架构上它们是 32 位的。

      可以使用表格 3-2 中的任何一种形式编写数字字面值。请注意可以是多种数字类型的数字字面值允许使用类型后缀，例如 57u8 来指定类型，同时也允许使用 _ 做为分隔符以方便读数，例如1_000，它的值与你指定的 1000 相同。

      表格 3-2: Rust 中的整型字面值
      数字字面值	                例子
      Decimal (十进制)	          98_222
      Hex (十六进制)	            0xff
      Octal (八进制)	            0o77
      Binary (二进制)	          0b1111_0000
      Byte (单字节字符)(仅限于`u8`)	b'A'
   */
  let n = 123; //默认是i32类型
  let n: i8 = -123;
  println!("{}", n);
  // let n:u8 = -123; //error[E0600]: cannot apply unary operator `-` to type `u8`
  let n: f32 = 0.0009;
  println!("{}", n); //0.0009

  /** 3.2 自适应整数类型: 和平台有关系
         通常用于索引某种数据集合的时候 比如说索引一个数组 数组的下标 它的类型是usize
         32位系统 与 64位系统 最大的区别是？ ---> 它们的内存寻址范围不同
         32位系统的寻址范围是 0 ~ 2^32-1 ,即 32 位系统上 最大的地址为 2^32-1
         64位系统的寻址范围是 0 ~ 2^64-1
   */
  // let s:isize =
  // let s:usize =
  println!("max = {}", usize::MAX); //18446744073709551615

  /** 5. 数组: [Type; size] */
  // https://kaisery.github.io/trpl-zh-cn/ch03-02-data-types.html#%E6%95%B0%E7%BB%84%E7%B1%BB%E5%9E%8B
  // 当你想要在栈（stack） ←←  没错数组在rust中是分配在栈上的 而不是堆上的, 也就是说 这东西 并不会存在所有权丧失的问题
  // 而不是在堆（heap）上为数据分配空间（第四章将讨论栈与堆的更多内容），
  // 或者是想要确保总是有固定数量的元素时，数组非常有用。
  // 但是数组并不如 vector 类型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不确定是应该使用数组还是 vector 的时候，你可能应该使用 vector。第八章会详细讨论 vector。
  let arr: [u32; 5] = [1, 2, 3, 4, 5];
  println!("arr[0] = {}", arr[0]); //arr[0] = 1
  // 数组长度也是类型的一部分
  // show(arr); //c/c++ 里传递的是一个数组的指针, 数组的长度(size)是不起限制作用的, 但rust里会
  for item in arr {
    println!("{}", item);
  }

  /** 6. 元组 */
  let tup: (i32,f32,char) = (-3,3.14,'棒');
  let tup = (-3,3.14,'棒');
  println!("{}", tup.0); //-3
  println!("{}", tup.2); //棒
  // 拆解 类似于解构
  let (x,y,z) = tup;
  println!("{},{},{}",x,y,z); //-3,3.14,棒

  // /** 7. */
}

fn show(arr: [u32; 3]) {
  for i in &arr {
    println!("{}",i);
  }
}
